<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>Deadlock detection using timers</title>
    <link rel="stylesheet" href="gettingStarted.css" type="text/css" />
    <meta name="generator" content="DocBook XSL Stylesheets V1.73.2" />
    <link rel="start" href="index.html" title="Berkeley DB Programmer's Reference Guide" />
    <link rel="up" href="lock.html" title="Chapter 18.  The Locking Subsystem" />
    <link rel="prev" href="lock_dead.html" title="Deadlock detection" />
    <link rel="next" href="lock_deaddbg.html" title="Deadlock debugging" />
  </head>
  <body>
    <div xmlns="" class="navheader">
      <div class="libver">
        <p>Library Version 12.1.6.2</p>
      </div>
      <table width="100%" summary="Navigation header">
        <tr>
          <th colspan="3" align="center">Deadlock detection using
        timers</th>
        </tr>
        <tr>
          <td width="20%" align="left"><a accesskey="p" href="lock_dead.html">Prev</a> </td>
          <th width="60%" align="center">Chapter 18.  The Locking Subsystem </th>
          <td width="20%" align="right"> <a accesskey="n" href="lock_deaddbg.html">Next</a></td>
        </tr>
      </table>
      <hr />
    </div>
    <div class="sect1" lang="en" xml:lang="en">
      <div class="titlepage">
        <div>
          <div>
            <h2 class="title" style="clear: both"><a id="lock_timeout"></a>Deadlock detection using
        timers</h2>
          </div>
        </div>
      </div>
      <p>
        Lock and transaction timeouts may be used in place of, or in
        addition to, regular deadlock detection. If lock timeouts are
        set, lock requests will return <a class="link" href="program_errorret.html#program_errorret.DB_LOCK_NOTGRANTED">DB_LOCK_NOTGRANTED</a> 
        from a lock call when it is
        detected that the lock's timeout has expired, that is, the
        lock request has blocked, waiting, longer than the specified
        timeout. If transaction timeouts are set, lock requests will
        return <a class="link" href="program_errorret.html#program_errorret.DB_LOCK_NOTGRANTED">DB_LOCK_NOTGRANTED</a> 
        from a lock call when it has been detected that the transaction has been
        active longer than the specified timeout.
    </p>
      <p>
        If lock or transaction timeouts have been set, database
        operations will return <a class="link" href="program_errorret.html#program_errorret.DB_LOCK_DEADLOCK">DB_LOCK_DEADLOCK</a> 
        when the lock timeout has expired
        or the transaction has been active longer than the specified
        timeout. Applications wanting to distinguish between true
        deadlock and timeout can use the <a href="../api_reference/C/envset_flags.html" class="olink">DB_ENV-&gt;set_flags()</a> configuration
        flag, which causes database operations to instead return <a class="link" href="program_errorret.html#program_errorret.DB_LOCK_NOTGRANTED">DB_LOCK_NOTGRANTED</a> 
        in the case of timeout.
    </p>
      <p>
        As lock and transaction timeouts are only checked when lock
        requests first block or when deadlock detection is performed,
        the accuracy of the timeout depends on how often deadlock
        detection is performed. More specifically, transactions will
        continue to run after their timeout has expired if they do not
        block on a lock request after that time. A separate deadlock
        detection thread (or process) should always be used if the
        application depends on timeouts; otherwise, if there are no
        new blocked lock requests a pending timeout will never
        trigger.
    </p>
      <p>
        If the database environment deadlock detector has been
        configured with the <a href="../api_reference/C/lockdetect.html#detect_DB_LOCK_EXPIRE" class="olink">DB_LOCK_EXPIRE</a> option, timeouts are the
        only mechanism by which deadlocks will be broken. If the
        deadlock detector has been configured with a different option,
        then regular deadlock detection will be performed, and in
        addition, if timeouts have also been specified, lock requests
        and transactions will time out as well.
    </p>
      <p>
        Lock and transaction timeouts may be specified on a database
        environment wide basis using the <a href="../api_reference/C/envset_timeout.html" class="olink">DB_ENV-&gt;set_timeout()</a> method. Lock
        timeouts may be specified on a per-lock request basis using
        the <a href="../api_reference/C/lockvec.html" class="olink">DB_ENV-&gt;lock_vec()</a> method. Lock and transaction timeouts may be
        specified on a per-transaction basis using the
        <a href="../api_reference/C/txnset_timeout.html" class="olink">DB_TXN-&gt;set_timeout()</a> method. Per-lock and per-transaction timeouts
        supersede environment wide timeouts.
    </p>
      <p>
        For example, consider that the environment wide transaction
        timeout has been set to 20ms, the environment wide lock
        timeout has been set to 10ms, a transaction has been created
        in this environment and its timeout value set to 8ms, and a
        specific lock request has been made on behalf of this
        transaction where the lock timeout was set to 4ms. By default,
        transactions in this environment will be timed out if they
        block waiting for a lock after 20ms. The specific transaction
        described will be timed out if it blocks waiting for a lock
        after 8ms. By default, any lock request in this system will be
        timed out if it blocks longer than 10ms, and the specific lock
        described will be timed out if it blocks longer than
        4ms.
    </p>
    </div>
    <div class="navfooter">
      <hr />
      <table width="100%" summary="Navigation footer">
        <tr>
          <td width="40%" align="left"><a accesskey="p" href="lock_dead.html">Prev</a> </td>
          <td width="20%" align="center">
            <a accesskey="u" href="lock.html">Up</a>
          </td>
          <td width="40%" align="right"> <a accesskey="n" href="lock_deaddbg.html">Next</a></td>
        </tr>
        <tr>
          <td width="40%" align="left" valign="top">Deadlock detection </td>
          <td width="20%" align="center">
            <a accesskey="h" href="index.html">Home</a>
          </td>
          <td width="40%" align="right" valign="top"> Deadlock debugging</td>
        </tr>
      </table>
    </div>
  </body>
</html>
